package com.chisheng.caa.util;

import cn.hutool.core.io.FileUtil;
import com.alibaba.excel.EasyExcel;
import com.alibaba.excel.read.metadata.ReadSheet;
import com.chisheng.caa.pojo.dto.ExcelSheetDTO;
import com.chisheng.caa.pojo.entity.FileMetadata;

import java.io.ByteArrayOutputStream;
import java.io.InputStream;
import java.util.Collection;
import java.util.List;
import java.util.Map;
import java.util.Objects;

/**
 * EasyExcel 工具类
 */
public final class EasyExcelUtil {

    /**
     * Excel 文件的默认后缀
     */
    public final static String DEFAULT_EXT = "xlsx";

    /**
     * 支持的 Excel 文件的 MIME 类型
     */
    public final static Map<String, String> EXCEL_MIME = Map.of(
            "xls", "application/vnd.ms-excel application/x-excel",
            "xlsx", "application/vnd.openxmlformats-officedocument.spreadsheetml.sheet");

    private EasyExcelUtil() {
        throw new UnsupportedOperationException();
    }

    /**
     * 返回 Excel 文件中所有的工作表列表
     *
     * @param is Excel 文件流
     * @return 工作表列表
     */
    public static List<ReadSheet> getSheetList(InputStream is) {
        return EasyExcel.read(is).build().excelExecutor().sheetList();
    }

    /**
     * 写 Excel 文件为字节数组。
     */
    public static <T> byte[] write(Class<T> head, Collection<? extends T> data, ExcelSheetDTO sheet) {
        ByteArrayOutputStream os = new ByteArrayOutputStream();
        EasyExcel.write(os, head).sheet(sheet.getSheetNo(), sheet.getSheetName()).doWrite(data);
        return os.toByteArray();
    }

    /**
     * 判断文件是否是 Excel 文件
     */
    public static boolean isExcel(FileMetadata metadata) {
        String suffix = FileUtil.getSuffix(metadata.getFilename()).toLowerCase();
        String contentType = Objects.requireNonNullElse(EXCEL_MIME.get(suffix), "");
        return contentType.equalsIgnoreCase(metadata.getContentType());
    }

}
